package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.FonteDeRecursoDAO;
import br.com.duosoftware.orcamento.daos.FonteDeRecursoDespesaDAO;
import br.com.duosoftware.orcamento.entidades.FonteDeRecurso;
import br.com.duosoftware.orcamento.entidades.FonteDeRecursoDespesa;
import br.com.duosoftware.orcamento.entidades.Orcamento;
import br.com.duosoftware.orcamento.services.FonteDeRecursoDespesaService;
import br.com.duosoftware.orcamento.utils.ManagedBeanUtil;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Renato
 *
 */
@ManagedBean
@ViewScoped
public class FonteDeRecursoDespesaBean implements Serializable {

    private FonteDeRecursoDespesa fonteDeRecursoDespesa;
    private List<FonteDeRecursoDespesa> fontesDeRecursoDespesa;
    private FonteDeRecursoDespesaDAO fonteDeRecursoDespesaDAO;
    private FonteDeRecursoDespesaService fonteDeRecursoDespesaService;
    //
    private List<SelectItem> fontesDeRecurso;
    //
    private OrcamentoBean orcamentoBean;

    public FonteDeRecursoDespesaBean() {
        
        fonteDeRecursoDespesaService = new FonteDeRecursoDespesaService();

        orcamentoBean = (OrcamentoBean) ManagedBeanUtil.getContextInfo("#{orcamentoBean}");

        fonteDeRecursoDespesaDAO = new FonteDeRecursoDespesaDAO();

    }

    public FonteDeRecursoDespesa getfonteDeRecursoDespesa() {
        return fonteDeRecursoDespesa;
    }

    public void setFonteDeRecursoDespesa(FonteDeRecursoDespesa fonteDeRecursoDespesa) {
        this.fonteDeRecursoDespesa = fonteDeRecursoDespesa;
    }

    public List<FonteDeRecursoDespesa> getFontesDeRecursoDespesa() {
        return fontesDeRecursoDespesa;
    }

    public void setfontesDeRecursoDespesa(List<FonteDeRecursoDespesa> fontesDeRecursoDespesa) {
        this.fontesDeRecursoDespesa = fontesDeRecursoDespesa;
    }

    public FonteDeRecursoDespesaService getFonteDeRecursoDespesaService() {
        return fonteDeRecursoDespesaService;
    }

    public void setFonteDeRecursoDespesaService(FonteDeRecursoDespesaService fonteDeRecursoDespesaService) {
        this.fonteDeRecursoDespesaService = fonteDeRecursoDespesaService;
    }

    /**
     *
     *
     */
    public void inicializarFontesDeRecursoDespesa() {

        Orcamento orcamento = orcamentoBean.getOrcamento();

        if (orcamento != null && orcamento.getId() != null) {

            fontesDeRecursoDespesa = fonteDeRecursoDespesaDAO.listarFontesDeRecursoDespesa(orcamentoBean.getOrcamento());

        } else {

            fontesDeRecursoDespesa = null;

        }

    }

    /**
     * <b>Método que inicializa a fonteDeRecursoDespesa a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        Orcamento orcamento = orcamentoBean.getOrcamento();

        if (orcamento == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um Orçamento para incluir um item");

        } else {

            fonteDeRecursoDespesa = new FonteDeRecursoDespesa();
            fonteDeRecursoDespesa.setOrcamento(orcamento);

            RequestContext.getCurrentInstance().execute("dlgFonteDeRecursoDespesa.show()");

        }

    }

    /**
     * <b>Método que adiciona ou edita uma FonteDeRecursoDespesa</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        if (!fonteDeRecursoDespesaService.verificarTotalValorFonteDeRecurso(fonteDeRecursoDespesa)) {

            Mensagens.mensagemDeErro("Valor Fonte", "A soma dos valores são maiores que o Valor da Despesa do Orçamento");

        } else {
            fonteDeRecursoDespesaDAO.salvarOuAtualizar(fonteDeRecursoDespesa);
            fonteDeRecursoDespesa = new FonteDeRecursoDespesa();
            fontesDeRecursoDespesa = null;

            inicializarFontesDeRecursoDespesa();

            RequestContext requestContext = RequestContext.getCurrentInstance();
            requestContext.execute("dlgFonteDeRecursoDespesa.hide()");
            requestContext.update("formDotacoes:dtFontesDeRecursoDespesa");
        }
    }

    /**
     * <b>Método para iniciar o processo de edição de um
     * FonteDeRecursoDespesa.</b>
     * <p>
     *
     * Ele verifica se há um FonteDeRecursoDespesa selecionada para edição, se
     * não houver é emitida uma mensagem pedindo que o usuário selecione uma.<p>
     *
     * Caso haja um FonteDeRecursoDespesa selecionado o médoto abre o dialog
     * para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (fonteDeRecursoDespesa == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgFonteDeRecursoDespesa.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * FonteDeRecursoDespesa.</b>
     * <p>
     *
     * Ele verifica se há uma FonteDeRecursoDespesa selecionado para exclusão,
     * se não houver é emitida uma mensagem pedindo que o usuário selecione
     * uma.<p>
     *
     * Caso haja um FonteDeRecursoDespesa selecionado o médoto abre um p:dialog
     * para confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (fonteDeRecursoDespesa == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirFonteDeRecursoDespesa.show()");
        }

    }

    /**
     * <b>Método para excluir um FonteDeRecursoDespesa.</b>
     * <p>
     *
     * Ele verifica se a FonteDeRecursoDespesa selecionado para exclusão está
     * sendo utilizado por alguma outra tabela do banco. Se estiver uma mensagem
     * de aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            fonteDeRecursoDespesaDAO.excluir(fonteDeRecursoDespesa);
            fonteDeRecursoDespesa = new FonteDeRecursoDespesa();
            fontesDeRecursoDespesa = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirFonteDeRecursoDespesa.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b>
     * <p>
     *
     * O método instancia um novo objeto na variável FonteDeRecursoDespesa para
     * limpar as infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        fonteDeRecursoDespesa = new FonteDeRecursoDespesa();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFonteDeRecursoDespesa.hide()");
        requestContext.update("formDotacoes:dtFontesDeRecursoDespesa");

    }

    //get's de Select Item's
    public List<SelectItem> getFontesDeRecurso() {

        if (fontesDeRecurso == null) {

            fontesDeRecurso = new LinkedList<SelectItem>();

            for (FonteDeRecurso fonteDeRecurso : new FonteDeRecursoDAO().listarFontesDeRecurso()) {

                fontesDeRecurso.add(new SelectItem(fonteDeRecurso, fonteDeRecurso.toString()));

            }

        }

        return fontesDeRecurso;

    }

}
